Przykad 4.11. Realizacja sortowania kubekowego w jzyku C
extern int hash (void *elt);
extern int numBuckets (int numElements);

/* Lista powizana elementw w kubeku */
typedef struct entry {
   void         *element;
   struct entry *next;
} ENTRY;

/* Utrzymuj licznik wpisw w kadym kubeku i wskanik do pierwszego wpisu */
typedef struct {
   int       size;
   ENTRY     *head;
} BUCKET;

/* Przydzia kubekw i liczba przydzielonych kubekw */
static BUCKET *buckets = 0;
static int num = 0;

/** Wyjmuj kolejno i zastpuj elementy ar */
void extract (BUCKET *buckets, int(*cmp)(const void *, const void *),
              void **ar, int n) {
   int i, low;
   int idx = 0;
   for (i = 0; i < num; i++) {
      ENTRY *ptr, *tmp;
      if (buckets[i].size == 0) continue;   /* kubeek jest pusty */

      ptr = buckets[i].head;
      if (buckets[i].size == 1) {
         ar[idx++] = ptr->element;
         free(ptr);
         buckets[i].size = 0;
         continue;
      }

      /* Sortowanie przez wstawianie elementw pobieranych z listy powizanej
       * i wstawianych do tablicy. Listy powizane s zwalniane */
      low = idx;
      ar[idx++] = ptr->element;
      tmp = ptr;
      ptr = ptr->next;
      free(tmp);

      while (ptr != NULL) {
         int i = idx-1;
         while (i >= low && cmp(ar[i], ptr->element) > 0) {
            ar[i+1] = ar[i];
            i--;
         }
         ar[i+1] = ptr->element;
         tmp = ptr;
         ptr = ptr->next;
         free(tmp);
         idx++;
      }
      buckets[i].size = 0;
   }
}

void sortPointers (void **ar, int n,
                   int(*cmp)(const void *, const void *)) {
   int i;
   num = numBuckets(n);
   buckets = (BUCKET *)calloc(num, sizeof(BUCKET));
   for (i = 0; i < n; i++) {
      int k = hash(ar[i]);

      /** Wstaw kady element i zwikszaj liczniki */
      ENTRY *e = (ENTRY *)calloc(1, sizeof(ENTRY));
      e->element = ar[i];
      if (buckets[k].head == NULL) {
         buckets[k].head = e;
      } else {
         e->next = buckets[k].head;
         buckets[k].head = e;
      }

      buckets[k].size++;
   }

   /* Teraz czytaj i zastpuj ar */
   extract(buckets, cmp, ar, n);

   free(buckets);
}
